package br.com.dwii.tpg2.entidade;

import br.com.dwii.tpg2.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Diego
 */
public class Animal {
    
    private Long id;
    private Long idResponsavel;
    private Long idContato;
    private Long idCaracteristica;
    private String nome;
    private String temperamento;
    private String historico;
    private byte[] foto;
    private String contentType;
    private String flagAdotado;
    private java.util.Date dataCadastro;
    private List<Animal> listUltimos;
    private List<Animal> listAdotados;
    private List<Animal> listBusca;

    public java.util.Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(java.util.Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public String getFlagAdotado() {
        return flagAdotado;
    }

    public void setFlagAdotado(String flagAdotado) {
        this.flagAdotado = flagAdotado;
    }

    public byte[] getFoto() {
        return foto;
    }

    public void setFoto(byte[] foto) {
        this.foto = foto;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public String getHistorico() {
        return historico;
    }

    public void setHistorico(String historico) {
        this.historico = historico;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getIdCaracteristica() {
        return idCaracteristica;
    }

    public void setIdCaracteristica(Long idCaracteristica) {
        this.idCaracteristica = idCaracteristica;
    }

    public Long getIdContato() {
        return idContato;
    }

    public void setIdContato(Long idContato) {
        this.idContato = idContato;
    }

    public Long getIdResponsavel() {
        return idResponsavel;
    }

    public void setIdResponsavel(Long idResponsavel) {
        this.idResponsavel = idResponsavel;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTemperamento() {
        return temperamento;
    }

    public void setTemperamento(String temperamento) {
        this.temperamento = temperamento;
    }
    
    public void save() throws SQLException {
        Connection conn = DBUtil.getConnection();
        PreparedStatement ps = null;
        try {
            String sql = "insert into animal (id_responsavel, id_contato, id_caracteristica, nome, temperamento, historico, foto, content_type, data_cadastro) values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
            ps = conn.prepareStatement(sql);
            ps.setLong(1, this.idResponsavel);
            ps.setLong(2, this.idContato);
            ps.setLong(3, this.idCaracteristica);
            ps.setString(4, this.nome.toUpperCase());
            ps.setString(5, this.temperamento);
            ps.setString(6, this.historico);
            ps.setBytes(7, this.foto);
            ps.setString(8, this.contentType);
            ps.setTimestamp(9, new  java.sql.Timestamp(new java.util.Date().getTime()));
            ps.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(Animal.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        } finally {
            ps.close();
            conn.close();
        }
    }

    // Metodo utilizado pela HOME para listar os últimos animais cadastrados
    public List<Animal> getListUltimos() throws SQLException {
        List<Animal> listObject = new ArrayList<Animal>();
        Connection conn = DBUtil.getConnection();
        Statement s = null;
        ResultSet rs = null;
        try {
            s = conn.createStatement();
            String sql = "select id, id_responsavel, id_contato, id_caracteristica, nome, temperamento, historico, flag_adotado, data_cadastro from animal order by data_cadastro desc limit 0,10";
            rs = s.executeQuery(sql); // Vai retornar os últimos 10 cadastrados
            while (rs.next()) {
                Animal obj = new Animal();
                obj.setId(rs.getLong(1));
                obj.setIdResponsavel(rs.getLong(2));
                obj.setIdContato(rs.getLong(3));
                obj.setIdCaracteristica(rs.getLong(4));
                obj.setNome(rs.getString(5));
                obj.setTemperamento(rs.getString(6));
                obj.setHistorico(rs.getString(7));
                obj.setFlagAdotado(rs.getString(8));
                obj.setDataCadastro(rs.getTimestamp(9));
                listObject.add(obj);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Animal.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        } finally {
            s.close();
            rs.close();
            conn.close();
        }
        return listObject;
    }
    
    // Metodo utilizado pela página de adotados para listar os animais adotados
    public List<Animal> getListAdotados() throws SQLException {
        List<Animal> listObject = new ArrayList<Animal>();
        Connection conn = DBUtil.getConnection();
        Statement s = null;
        ResultSet rs = null;
        try {
            s = conn.createStatement();
            String sql = "select id, id_responsavel, id_contato, id_caracteristica, nome, temperamento, historico, flag_adotado, data_cadastro from animal where flag_adotado = 'S' order by nome";
            rs = s.executeQuery(sql);
            while (rs.next()) {
                Animal obj = new Animal();
                obj.setId(rs.getLong(1));
                obj.setIdResponsavel(rs.getLong(2));
                obj.setIdContato(rs.getLong(3));
                obj.setIdCaracteristica(rs.getLong(4));
                obj.setNome(rs.getString(5));
                obj.setTemperamento(rs.getString(6));
                obj.setHistorico(rs.getString(7));
                obj.setFlagAdotado(rs.getString(8));
                obj.setDataCadastro(rs.getTimestamp(9));
                listObject.add(obj);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Animal.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        } finally {
            s.close();
            rs.close();
            conn.close();
        }
        return listObject;
    }
    
    // Metodo utilizado pela página de busca para listar os animais conforme os filtros selecionados
    public static List<Animal> getListBusca(String sqlWhere) throws SQLException {
        List<Animal> listObject = new ArrayList<Animal>();
        Connection conn = DBUtil.getConnection();
        Statement s = null;
        ResultSet rs = null;
        try {
            s = conn.createStatement();
            StringBuilder sql = new StringBuilder();
            sql.append("  select a.id, a.id_responsavel, a.id_contato, a.id_caracteristica, a.nome, a.temperamento, a.historico, a.flag_adotado, a.data_cadastro ");
            sql.append("    from animal a ");
            sql.append("       , caracteristica c ");
            sql.append("   where a.id_caracteristica = c.id ");
            sql.append(sqlWhere);
            sql.append(" order by a.nome, a.data_cadastro");
            rs = s.executeQuery(sql.toString());
            while (rs.next()) {
                Animal obj = new Animal();
                obj.setId(rs.getLong(1));
                obj.setIdResponsavel(rs.getLong(2));
                obj.setIdContato(rs.getLong(3));
                obj.setIdCaracteristica(rs.getLong(4));
                obj.setNome(rs.getString(5));
                obj.setTemperamento(rs.getString(6));
                obj.setHistorico(rs.getString(7));
                obj.setFlagAdotado(rs.getString(8));
                obj.setDataCadastro(rs.getTimestamp(9));
                listObject.add(obj);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Animal.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        } finally {
            s.close();
            rs.close();
            conn.close();
        }
        return listObject;
    }
}
